package com.faithbj.process;

import com.faithbj.support.fp.Tuple2;
import com.google.common.base.Function;
import com.google.common.collect.Multimap;
import com.google.common.collect.Table;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 流程查询服务.
 * User: xiongyuanwei
 * Date: 12-7-7
 * Time: 上午11:55
 */
public interface ProcessQueryService {

    /**
     * 根据任务id获取任务详情.
     * 包含流程变量.
     * @param taskId 任务id
     * @return TaskModel
     */
    TaskModel getTaskWithContent(long taskId);

    /**
     * 获取用户的待办任务.
     * 包含流程变量.
     * @param userId 用户名
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAvailableTasksWithContentByUser(String userId, int first, int limit, TaskModelFilter filter);

    /**
     * 获取所有用户的待办任务.
     * 包含流程变量.
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAllAvailableTasksWithContent(int first, int limit);

    int countAllAvailableTasks();

    /**
     * 获取用户的待办任务.
     * 包含流程变量.
     * @param userId 用户名
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAvailableTasksWithContentByUserAndState(String userId, State state, int first, int limit, TaskModelFilter filter);

    int countAvailableTasksByUserAndState(String userId, State state, TaskModelFilter filter);

    /**
     * 获取所有用户的待办任务.
     * 包含流程变量.
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAllAvailableTasksWithContentByState(State state, int first, int limit);

    int countAllAvailableTasksByState(State state);

    /**
     * 对用户的待办任务进行条件搜索.
     *
     * @param condition 搜索条件
     * @param userId 用户名
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    <T> List<TaskModel> search(Condition<T> condition, String userId, State state, int first, int limit, Function<Map<String, Object>, T> extractFn, TaskContentFilter filter);

    <T> int countSearch(Condition<T> condition, String userId, State state, Function<Map<String, Object>, T> extractFn, TaskContentFilter filter);

    <T> List<TaskModel> searchAll(Condition<T> condition, State state, int first, int limit, Function<Map<String, Object>, T> extractFn);

    <T> Multimap<Object, TaskModel> groupedSearchAll(Condition<T> condition, State state, int first, int limit, Function<Map<String, Object>, T> extractFn);

    long getTaskIdByProcessInstanceIdAndState(long processInstanceId, State state);

    Map<Long, StartAndEndDateOfTaskTuple> getStartAndEndDatesByTasks(List<Long> taskIds);

    Table<Long, State, Tuple2<Date, Date>> getStartAndEndDatesByProcessInstancesAndStates(Collection<Long> processInstanceIds, Collection<String> nodeNames);

    Multimap<Long, TaskModel> getTaskModelsByProcessInstanceIds(List<Long> processInstanceIds);

    Multimap<Long, TaskModel> getTaskModelsByProcessInstanceIdsAndStates(Collection<Long> processInstanceIds, Collection<State> states);

    Map<Long, Long> getProcessInstanceIdsByTaskIds(List<Long> taskIds);

    List<TaskModel> listAllTasksByStates(Collection<State> states);
}
